package Persistencia;

import java.sql.*;
import java.util.ArrayList;

public class Agente {
	
	private static Agente _instancia = null;
	private static Connection _conexion = null;
	
	private Agente() throws PersistenciaException{
		//Hare un archivo de configuracion para esto
		//Es una prueba de conexion, para la base de datos de Ari
//		final String url = "jdbc:mysql://localhost:3306/ISOBET";
		final String url = "jdbc:mysql://localhost:3306/ISOBET";
		//final String url = "jdbc:mysql://jokertech.sytes.net:3306/ISOBET";
		final String user = "usuario";
		final String pass = "pass";
		try{
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			_conexion = DriverManager.getConnection(url,user,pass);
		}catch(Exception ex) {
		    // handle any errors
		    throw new PersistenciaException("No se puede conectar con la BD");
		}
	}
	
	public static Agente getAgente() throws PersistenciaException{
		if(_instancia == null)
			_instancia = new Agente();
		return _instancia;
	}
	
	public void desconectar(){
		if(_conexion != null){
			try{
				_conexion.close();
			}catch(SQLException e){
				System.out.println("SQLException: " + e.getMessage());
			    System.out.println("SQLState: " + e.getSQLState());
			    System.out.println("VendorError: " + e.getErrorCode());
			}
		}
	}
	//El resultado(ArrayList) contiene una lista de tuplas(ArrayList) que contiene una 
	//lista de columnas
	public ArrayList<ArrayList<Object>> selectList(String SQL) throws PersistenciaException{
		ArrayList<ArrayList<Object>> ret = new ArrayList<ArrayList<Object>>();
		ArrayList<Object> aux;
        ResultSetMetaData metaData = null;
        int numColum;
        try{
            PreparedStatement select = _conexion.prepareStatement(SQL);
            ResultSet result = select.executeQuery();
            metaData = select.getMetaData();
            numColum = metaData.getColumnCount();
            while(result.next()){
                aux = new ArrayList<Object>();
                for(int i = 1; i <= numColum; i++)
                    aux.add(result.getObject(i)); 
                ret.add(aux);
            }
            select.close();
            result.close();
        }
        catch(SQLException e){
        	throw new PersistenciaException(e.getMessage());
        }
		return ret;
	}
	
	//2 metodos de consulta, este que devuelve un ResultSet podemos
	//consultar mas comodamente, ya que permite devolver la columna 
	//con el nombre seleccionado
	public ResultSet selectResult(String SQL){
		ResultSet result = null;
		try{
			PreparedStatement select = _conexion.prepareStatement(SQL);
            result = select.executeQuery();
		}catch(SQLException e){
			System.out.println("SQLException: " + e.getMessage());
		    System.out.println("SQLState: " + e.getSQLState());
		    System.out.println("VendorError: " + e.getErrorCode());
		}
		return result;
	}
	
	public boolean insert(String SQL) throws PersistenciaException{
		try{
	        PreparedStatement insert = _conexion.prepareStatement(SQL);
	        if(insert.executeUpdate() != 0)
	        	return true;
		} catch(SQLException e){
			throw new PersistenciaException(e.getMessage());
		}
		throw new PersistenciaException("BBDD: No se puede insertar");
	}
	
	public boolean update(String SQL) throws PersistenciaException{
		try{
			PreparedStatement update = _conexion.prepareStatement(SQL);
	        if(update.executeUpdate() != 0)
	        	return true;
		} catch(SQLException e){
			throw new PersistenciaException(e.getMessage());
		}
		throw new PersistenciaException("BBDD: No se puede actualizar");
	}
	
	public boolean delete(String SQL) throws PersistenciaException{
		try{
			PreparedStatement delete = _conexion.prepareStatement(SQL);
			if(delete.executeUpdate() != 0)
	        	return true;
		} catch(SQLException e){
			throw new PersistenciaException(e.getMessage());
		}
		throw new PersistenciaException("BBDD: No se puede actualizar");
	}
}